#ifndef INTERRUPT_H
#define INTERRUPT_H

#include <stdint.h>

// 中断处理函数类型（与任务定义一致）
typedef void (*interrupt_handler_t)(void);

// 中断优先级（0为最低，7为最高，适配RISC-V PLIC控制器）
typedef enum {
    IRQ_PRIORITY_0 = 0,
    IRQ_PRIORITY_1,
    IRQ_PRIORITY_2,
    IRQ_PRIORITY_3,
    IRQ_PRIORITY_4,
    IRQ_PRIORITY_5,
    IRQ_PRIORITY_6,
    IRQ_PRIORITY_7
} irq_priority_t;

// 中断源定义（根据RISC-V平台常见设备扩展，需与硬件匹配）
typedef enum {
    IRQ_TIMER = 1,    // 时钟中断（CLINT）
    IRQ_UART = 3,     // UART串口中断（PLIC）
    IRQ_GPIO = 5,     // GPIO中断（PLIC）
    // 可扩展其他中断源
} irq_num_t;

// 中断向量表结构（支持共享中断，每个IRQ可注册多个处理函数）
#define MAX_HANDLERS_PER_IRQ 4  // 每个中断最多4个共享处理函数
typedef struct {
    interrupt_handler_t handlers[MAX_HANDLERS_PER_IRQ];  // 共享中断处理函数列表
    irq_priority_t priority;                             // 中断优先级
    uint8_t handler_count;                               // 已注册的处理函数数量
    uint8_t enabled;                                     // 中断使能标记（1=使能，0=禁用）
} irq_descriptor_t;

// 全局中断向量表（大小根据最大IRQ号定义）
#define MAX_IRQ_NUM 32
extern irq_descriptor_t irq_vector_table[MAX_IRQ_NUM];

// 中断控制接口（与任务定义一致，补充优先级参数）
void trap_init(void);                                  // 初始化中断系统
int register_interrupt(irq_num_t irq, interrupt_handler_t h, irq_priority_t prio);  // 注册中断（含优先级）
int unregister_interrupt(irq_num_t irq, interrupt_handler_t h);  // 注销中断
void enable_interrupt(irq_num_t irq);                  // 开启特定中断
void disable_interrupt(irq_num_t irq);                 // 关闭特定中断

// 中断处理核心函数（供汇编入口调用）
void trap_handler(uint64_t cause, uint64_t epc);

#endif
